package com.flymobi.mshop.view;

import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Transformation;
import android.widget.Gallery;
import android.widget.LinearLayout;
/**
 * 
 * @author 余鹏
 * 改写Gallery控件，实现一些android没有实现的效果
 */
public class GalleryFlow extends Gallery {


	private Camera mCamera = new Camera();


	private int mMaxRotationAngle = 60;


	private int mMaxZoom = -300;


	private int mCoveflowCenter;



	public GalleryFlow(Context context) {

		super(context);

		this.setStaticTransformationsEnabled(true);

	}


	public GalleryFlow(Context context, AttributeSet attrs) {

		super(context, attrs);

		this.setStaticTransformationsEnabled(true);

	}


	public GalleryFlow(Context context, AttributeSet attrs, int defStyle) {

		super(context, attrs, defStyle);

		this.setStaticTransformationsEnabled(true);

	}



	public int getMaxRotationAngle() {

		return mMaxRotationAngle;

	}



	public void setMaxRotationAngle(int maxRotationAngle) {

		mMaxRotationAngle = maxRotationAngle;

	}





	public int getMaxZoom() {

		return mMaxZoom;

	}



	public void setMaxZoom(int maxZoom) {

		mMaxZoom = maxZoom;

	}




	private int getCenterOfCoverflow() {


		return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2

		+ getPaddingLeft();

	}





	private static int getCenterOfView(View view) {

		return view.getLeft() + view.getWidth() / 2;

	}



	protected boolean getChildStaticTransformation(View child, Transformation t) {


		final int childCenter = getCenterOfView(child);

		final int childWidth = child.getWidth();

		int rotationAngle = 0;

		t.clear();

		t.setTransformationType(Transformation.TYPE_MATRIX);


		if (childCenter == mCoveflowCenter) {

			transformImageBitmap((LinearLayout) child, t, 0);

		} else {

			rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);

			if (Math.abs(rotationAngle) > mMaxRotationAngle) {

				rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle

						: mMaxRotationAngle;

			}

			transformImageBitmap((LinearLayout) child, t, rotationAngle);

		}



		return true;

	}




	protected void onSizeChanged(int w, int h, int oldw, int oldh) {

		mCoveflowCenter = getCenterOfCoverflow();

		super.onSizeChanged(w, h, oldw, oldh);

	}

	private void transformImageBitmap(LinearLayout child, Transformation t, int rotationAngle) {

		mCamera.save();

		final Matrix imageMatrix = t.getMatrix();

		final int imageHeight = child.getHeight();

		final int imageWidth = child.getWidth();

		final int rotation = Math.abs(rotationAngle);

		mCamera.translate(0.0f, 0.0f, 100.0f);

		if (rotation < mMaxRotationAngle) {

			float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));

			mCamera.translate(0.0f, 0.0f, zoomAmount);

		}

		mCamera.rotateY(rotationAngle);

		mCamera.getMatrix(imageMatrix);


		imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));

		imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));

		mCamera.restore();

	}

}